
#ifndef _TCPA_MONITOR_H_
#define _TCPA_MONITOR_H_

#include "const_define.h"
#include "user_list.h"

#include <stdint.h>
#include <pthread.h>
#include <stdbool.h>
#include <time.h>

typedef struct rule_cfg_t {
    bool        in_use;
    char        vrf_name[32];
    uint32_t    vrf_id;
    char        local_ip_str[20];
    char        src_ip_str[20];
    uint32_t    src_ip;
    char        dst_ip_str[20];
    uint32_t    dst_ip;
    uint16_t    src_port;
    uint16_t    dst_port;
    list_node_t node;
}rule_cfg_t;

typedef struct tcpa_cfg_t {
    // TCP加速配置信息
    char        vrf_name[32];
    uint32_t    vrf_id;
    uint8_t     tcpa_enable;
    uint32_t    max_connect;
    char        local_ip_str[20];
    char        server_ip_str[20];
    uint16_t    server_port;
    uint16_t    listen_port;
    net_mode_e  net_mode;
}tcpa_cfg_t;

// 退避启动结构变量
typedef struct backoff_t{
    uint32_t    try_cnt;
    uint32_t    interval;
    time_t      last_time;
}backoff_t;

typedef struct tcpa_ctrl_t {
    char        vrf_name[32];
    uint32_t    vrf_id;
    tcpa_cfg_t  tcpa_cfg;
    uint64_t    tcpa_pid;
    uint8_t     tcpa_action_mask;
    uint32_t    tcpa_restart_cnt;
    backoff_t   backoff;
    uint64_t    abnormal_state;
    list_node_t node;
}tcpa_ctrl_t;

typedef struct tcpa_cfg_file_t{
    // 配置文件类型
    char    cfg_name[32];
    // 配置文件路径
    char    file_path[CFG_FILE_PATH_LEN];
    int     inotify_fd;
}tcpa_cfg_file_t;

typedef struct tcpam_cfg_file_ctx_t{
    int         epoll_fd;
    int         exit_use_pipe[2];
    pthread_t   inotify_thread_fd;
    tcpa_cfg_file_t tcpa_cfg_file[CFG_FILE_TYPE_MAX_NUM];
}tcpam_cfg_file_ctx_t;

// 加速serverip存储结构
typedef struct pep_server_ip_t {
    int     g_bnn_id;
    char    ip[20];
}pep_server_ip_t;
// 加速svn网络信息存储结构（每个svn下，最多能有32个g_bnn）
typedef struct pep_svn_t {
    // 当前svn_id
    int     svn;   
    // 当前svn使用的ip、掩码
    char    now_svn_ip[20];
    uint8_t ip_mask;
    // 当前使用的pep_server_ip
    char    now_pep_server_ip[20];
    int     pep_server_num;
    pep_server_ip_t pep_server_ip[32];
}pep_svn_t;
// 加速svn网络信息存储结构（最多能有255个svn）
typedef struct pep_svn_info_t {
    // 配置文件路径
    char    file_path[CFG_FILE_PATH_LEN];
    int     now_g_bnn_id;
    // 当前有多少个svn
    int     svn_num;
    pep_svn_t pep_svn[VRF_MAX_NUM];
}pep_svn_info_t;

// tcp加速监测器结构体
typedef struct tcpa_monitor_t {

    // proc统计信息
    int         uproc_fd_tcpamonitor;
    int         uproc_fd_tcpacfg;
    int         uproc_fd_whitelist;

    // 网络模式
    net_mode_e  net_mode;

    // 配置文件相关变量
    tcpam_cfg_file_ctx_t tcpam_cfg_file_ctx;
    // svn网络信息
    pep_svn_info_t pep_svn_info;

    // 监测器当前运行状态
    tcpam_status_e monitor_status;
    // 终端登录状态
    rcst_login_e login_status;
    
    // 加速控制上下文
    list_head_t tcpa_ctrl_list;
    uint32_t    tcpa_ctrl_node_num;

    // 白名单规则
    list_head_t rule_list;
    uint32_t    rule_node_num;

    // 消息队列（避免保活机制与配置更新机制冲突）- 待优化（先用互斥锁实现同步）
    pthread_mutex_t cfg_mutex;

}tcpa_monitor_t;

tcpa_monitor_t* tcpa_monitor_create();
int tcpa_monitor_init(tcpa_monitor_t* monitor);
int tcpa_monitor_stop(tcpa_monitor_t* monitor);
void tcpa_monitor_destroy(tcpa_monitor_t* monitor);

// 入参解析函数
int decode_input_parameter(int argc, char* argv[], tcpa_monitor_t *tcpam);

// 监测器状态函数
int tcpam_proc_status(FILE *fd, void *user_data);
int tcpam_proc_tcpa_cfg(FILE *fd, void *user_data);
int tcpam_proc_whitelist_cfg(FILE *fd, void *user_data);

// 其他函数
int read_rcstnetcfg_json(tcpa_monitor_t *monitor);
int create_default_tcpa_cfg_file(char *file_path);
int tcpa_cfg_update_from_file(tcpa_monitor_t *monitor);
int creat_default_whitelist_file(char *file_path);
int whitelist_cfg_init_from_file(tcpa_monitor_t *monitor);
int listen_cfg_file_modify(tcpa_monitor_t *monitor);
int listen_rcst_login(tcpa_monitor_t *monitor);

#endif